from zipfile import ZipFile
import os


def password(path, password):
    """
    尝试使用给定的密码解压指定路径下的zip文件。

    参数:
    path (str): zip文件的路径。
    password (str): 尝试解压zip文件的密码。

    返回:
    bool: 如果解压成功，则返回True，否则返回False。
    """
    # 获取文件类型，用于后续判断是否为zip文件
    file_type = os.path.splitext(path)[-1][1:]

    # 如果文件类型是zip，则尝试解压
    if file_type == 'zip':
        with ZipFile(path, 'r') as zip:
            # 打印当前尝试的密码
            print(f'正在尝试密码：{password}')
            try:
                # 尝试使用提供的密码解压文件
                zip.extractall('./create_data/生成压缩文件', pwd=str(password).encode('utf-8'))
                # 如果解压成功，打印成功信息并返回True
                print(f'解压成功, 密码为：{password}')
                return True
            except Exception as e:
                # 如果解压失败，不打印错误信息，直接跳过
                pass



def create_password(length):
    """
    生成指定长度以下的所有可能密码的生成器函数。

    该函数使用字母和数字的组合来生成密码，支持生成从1到指定长度的所有可能组合。

    参数:
    length -- 密码的最大长度

    生成并返回:
    所有可能的密码字符串，从长度1到指定长度

    注意:
    由于密码组合的数量可能非常大，因此推荐谨慎使用此函数生成长密码。
    """
    # 导入itertools模块以使用其product函数进行笛卡尔积计算
    import itertools as its

    # 定义密码可能包含的字符集：数字和小写字母
    words = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

    # 循环从1到指定长度，生成所有可能的密码组合
    for i in range(1, length):
        # 使用itertools.product生成当前长度下所有可能的字符组合
        base = its.product(words, repeat=i)

        # 遍历当前长度下的所有字符组合
        for i in base:
            # 将字符组合连接成字符串并生成
            yield ''.join(i)


if __name__ == '__main__':
    num = input('请输入长度：')
    g = create_password(int(num))
    print(g)
    for pwd in g:
        flag = password('./base_data/aa.zip', pwd)
        if flag:
            break
